from django.shortcuts import render
from django.views import View
from areas.models import Area
from django.core.cache import cache
from django.http import JsonResponse
# Create your views here.

# 获取省级行政区信息接口
class ProvinceAreasView(View):
    """省级地区"""
    def get(self, request):
        # 1.提取参数:前端没有传任何参数过来，不用提取也不用校验
        # 2.校验参数
        # 3.业务数据处理－－查询数据库，把省级数据返回
        # 查询省级数据

        # TODO:读缓存
        province_list = cache.get('province_list')

        if not province_list:
            # 没有读到缓存数据，才需要到mysql中读取
            try:
                # 省级没有父级，所以通过parent=None可以过滤出省
                provinces = Area.objects.filter(parent=None)
            except Exception as e:
                return JsonResponse({'code': 400, 'errmsg': '服务器内部错误'})
            # 把每个省弄成一个字典，存到这个列表里
            province_list=[]
            for province in provinces:
                province_list.append({
                    'id': province.id,
                    'name': province.name
                })
            # TODO:写入缓存
            cache.set('province_list', province_list, 3600)

        # 4.构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'province_list': province_list
        })





# 获取子级行政区信息接口（市和区）
class SubAreasView(View):
    """子级地区：市和区县"""
    def get(self, request, pk):

        # TODO:读缓存
        sub_data = cache.get('sub_area_%s' %pk)

        # 1.提取参数
        # 2.校验参数
        # 3.业务数据处理--过滤出子级行政区信息

        # 如果缓存里没有
        if not sub_data:
            try:
                # 根据前端传来的主键从mysql取出省
                parent = Area.objects.get(pk=pk)
                # 根据省取出子级市区,关注模型类中的字段：related_name='subs',这个字段在从表中，用"主表.字段"可以取出从表中的多条数据
                subs = parent.subs.all()
            except Exception as e:
                return JsonResponse({'code': 400, 'errmsg': '数据库内部错误'})
            # 用于存储市和区｛id,name｝
            subs_list = []
            # sub是子级行政区对象
            for sub in subs:
                subs_list.append({
                    'id':sub.id,
                    'name':sub.name
                })
            # 带上省id和省名
            sub_data = {
                'id': parent.id,
                'name': parent.name,
                'subs': subs_list
            }

            # TODO:写缓存
            cache.set('sub_area_%s' % parent.id,sub_data, 3600)

        # 4.构建响应
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'sub_data': sub_data
        })

